/**
  ******************************************************************************
  * @file     
  * @author   古么宁
  * @brief    iec10x 协议栈链路层相关接口实现
  * @date     2019/12/12
  ******************************************************************************
  *
  * COPYRIGHT(c) 2019 GoodMorning
  *
  ******************************************************************************
  */
#ifndef _IEC_DEVICE_INTERFACE_
#define _IEC_DEVICE_INTERFACE_


/* Global  types ------------------------------------------------------------*/


/**
  * @author   古么宁
  * @brief    纪录注册协议栈与设备层交互接口
*/
typedef struct iec_devif {
	struct iec_slist   node    ; ///< 连通天地线的节点，管理设备接口
	dev_statfn_t       statefn ; ///< 信息结构体状态获取接口
	dev_getfn_t        readfn  ; ///< 信息体结构体内容获取接口
	dev_profn_t        profn   ; ///< 信息体结构体内容处理接口
	unsigned char      argsize ; ///< 信息结构体大小，比如带时标的单点信息结构体为多大
	unsigned char      type    ; ///< 键值，当前 ASDU 类型
}
iec_devif_t;


/* Global  macro ------------------------------------------------------------*/
/* Global  variables --------------------------------------------------------*/

extern const unsigned char iec_tysize[128] ;

/* Global  function prototypes ----------------------------------------------*/

/**
  * @brief    设备接口管理注册
  * @param    root     : 设备管理根目录，一般为 bus->device 
  * @param    type     : 当前数据接口的类型
  * @param    statfn   : 信息结构体状态获取接口
  * @param    getfn    : 信息体结构体内容获取接口
  * @param    profn    : 信息体结构体内容处理接口
  * @return   成功返回 0
*/
int iec_devif_register(
	struct iec_slist * root      ,
	unsigned char      type      ,
	dev_statfn_t       statfn    ,
	dev_getfn_t        getfn     ,
	dev_profn_t        profn   ) ;

/**
  * @author   古么宁
  * @brief    根据 ASDU 类型查找用户设备接口
  * @param    root     : 设备管理根目录，一般为 bus->device 
  * @param    ASDUtype :  ASDU 类型
  * @note     此处的接口在 @see iec_devif_insert 注册
  * @return   设备接口结构体指针
*/
struct iec_devif * iec_devif_find(struct iec_slist * root ,unsigned char ASDUtype) ;

/**
  * @brief    设备接口销毁
  * @param    root     设备管理根目录，一般为 bus->device 
  * @return   成功返回 0
*/
void iec_device_destroy(struct iec_slist * root) ;


#endif 
